clear;
clc;
addpath(genpath('../util'))
%大尺度衰弱参数
D0=1;
C0=10^(-30/10);
exponent_BS_LIS=2.2;
exponent_LIS_USER=2.8;

%BS位置
x_BS=0;
y_BS=0;
z_BS=25;

%LIS位置
x_IRS=50;
y_IRS=50;
z_IRS=40;

%用户位置范围
x_left=-50;
x_right=50;
y_left=50;
y_right=150;

%BS-LIS距离
d_BS_LIS=sqrt((x_BS-x_IRS)^2+(y_BS-y_IRS)^2)/1000;
[pathGain_BS_LIS] = pathLOS(d_BS_LIS,D0,exponent_BS_LIS,C0);

L = 3;
K = 1;
M=3;
F=eye(L);
NUM_timesamples = 1;
pathGain = ones(K,1);
K_factor = 5*ones(K,1);
e=10^(-3);
%disp('H1');
for ueIdx = 1:K
    tau(ueIdx)= 0; %rand;sqrt(0.01)
end
p_correlation = 0.3*ones(K,1);
for k = 1:K  
    for kk=1:L
        for ll=1:L
            T2(kk,ll,k) = (p_correlation(k))^(abs(kk-ll));
        end
    end
end


for i=1:NUM_timesamples
    for k=1:K
        x_user=rand*(x_right-x_left)+x_left;
        y_user=rand*(y_right-y_left)+y_left;
        d_IRS_user=sqrt((x_user-x_IRS)^2+(y_user-y_IRS)^2)/1000;
        pathGain(k,1)=pathLOS(d_IRS_user,D0,exponent_LIS_USER,C0)
%     pathGain(k,1)=1.0145e-08;
%     pathGain_BS_LIS=3.9210e-07;
%     pathGain(k,1)=1;
%     pathGain_BS_LIS=1;
    end
    
%     pathGain_BS_LIS=1;
    H1(:,:,i)=[0.1284 - 0.2122i   1.6711 - 0.0128i  -1.4871 - 1.3726i
               0.8019 + 1.1437i   0.7235 + 0.2853i   0.1670 - 1.3832i
               -0.5454 + 0.0522i  -0.9332 + 0.3540i  -1.9724 + 0.7499i];
    H1(:,:,i) = H1(:,:,i)*sqrt(L*pathGain_BS_LIS/trace(H1(:,:,i)*H1(:,:,i)'));
    Hbar2(:,:,i) =[0.0227 - 1.9652i  -1.3449 - 0.7791i  -0.4405 + 0.3562i];
    
    for ueIdx = 1:K
        T2(1:L,1:L,ueIdx) = pathGain(ueIdx)*(L/trace(T2(1:L,1:L,ueIdx)))*T2(1:L,1:L,ueIdx)/(K_factor(ueIdx)+1);
        Hbar2(ueIdx,1:L,i) = Hbar2(ueIdx,1:L,i) * sqrt(pathGain(ueIdx)) * sqrt(1/trace(Hbar2(ueIdx,1:L,i)*Hbar2(ueIdx,1:L,i)')) * sqrt(K_factor(ueIdx)/(K_factor(ueIdx)+1)) ;
    end
end

almax = 10^0;
almin = 10^(-8);

alpha_up = almax; %/rho
alpha_low = almin;%/rho

F_temp=eye(L);
P=50;
d=5;
f=5;
c1=2;
c2=2;
NUM=70;
result_PSO1=zeros(1,(P-f)/d+1);
result_PSO2=zeros(1,(P-f)/d+1);
result_PSO3=zeros(1,(P-f)/d+1);
p=20;
for i=1:NUM_timesamples
    i
    rho1 = 10^(90/10)
   [ F_best_PSO1,max_PSO1,alpha1 ]=AO(p,c1,c2,L,NUM,K,T2,Hbar2(:,:,i),tau,rho1,M,H1(:,:,i),e,"fix",alpha_low,alpha_up);
   Sumrate = Sumrate_MonteCarlo_test(K,L,M,rho1,1/rho1,1,T2,Hbar2,eye(L),H1,tau)
   max_PSO1
end

